package com.cskaoyan._06operate._05crud;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/2 9:53
 **/
/*
需求:
创建容量为10的String数组, 使用String数组保存人名,要求名字不能重复
模拟对人名的相关操作
 */
public class Demo {
    public static void main(String[] args) {
        // 定义String数组
        String[] names = new String[10];
        // 填充几个人名
        names[0] = "张三";
        names[1] = "李四";
        names[2] = "王五";
        names[3] = "赵六";

        // 输出
        System.out.println(Arrays.toString(names));
        // 写一个真实打印人名的方法
        System.out.println("-------");
        realPrintNames(names);
        // 键盘输入一个名字
        //Scanner scanner = new Scanner(System.in);
        //System.out.println("请输入一个名字进行插入操作:");
        //String name = scanner.nextLine();
        //
        //switch (createName(names, name)) {
        //    case 0:
        //        System.out.println("插入新的名字成功!");
        //        break;
        //    case 1:
        //        System.out.println("输入的名字重复,不合法!");
        //        break;
        //    case 2:
        //        System.out.println("数组容量已经满了!");
        //}
        //// 输出
        //realPrintNames(names);


        // 测试删除
        //boolean result = deleteName(names, "彭于晏");
        //if (result) {
        //    System.out.println("删除成功!");
        //}else{
        //    System.out.println("删除失败!");
        //}
        //System.out.println();
        //realPrintNames(names);

        // 测试更新
        //System.out.println();
        //System.out.println("------");
        //boolean result2 = updateName(names, "胡歌", "彭于晏");
        //if (result2) {
        //    System.out.println("更新成功");
        //}else {
        //    System.out.println("更新失败");
        //}
        //realPrintNames(names);



        // 查找测试
        //System.out.println();
        //System.out.println("--------");
        //int index = findName(names, "刘亦菲");
        //if (index == -1) {
        //    System.out.println("没有这个人");
        //} else {
        //
        //    System.out.println("下标是:"+index);
        //}
        //realPrintNames(names);

        // update2测试
        boolean result3 = updateName2(names, "张三", "吴彦祖");
        if (result3) {
            System.out.println("更新成功");
        } else {
            System.out.println("更新失败!");
        }
        realPrintNames(names);

    }

    // 定义一个输出方法,过滤掉null的元素
    public static void realPrintNames(String[] names) {
        // 期望格式[张三,李四,王五]
        System.out.print("[");
        // 遍历数组
        for (String name : names) {
            // 判断是否为null, 为null pass
            if (name == null) {
                continue;
            }
            // 输出元素值
            System.out.print(name);
            System.out.print(",");
        }

        // 循环结束

        // 去掉, \b]
        System.out.print("\b]");


    }


    /*
    增加操作(插入操作)
    分析:
        数组长度固定10
        整体思路:在数组中找到一个null的位置,把新名字替换一下
        结果:
            1.找到null,名字替换,插入成功
            2.数组满了,插入失败
            3.重名, 插入失败

        返回值为int:
            如果成功,返回0
            重名了,返回1
            数组满了,返回2

        参数:
            原来数组String[],新的名字String
     */
    public static int createName(String[] names, String newName) {
        // 遍历数组
        for (String name : names) {
            // 进行判断,判断有没有重名
            if (newName.equals(name)) {
                // 如果重名,返回1
                return 1;
            }

        }
        // 循环结束, 意味没有重名的
        // 再次遍历
        for (int i = 0; i < names.length; i++) {
            // 判断一下,找到null的位置,新的名字与null进行替换
            if (names[i] == null) {
                // 可以替换
                names[i] = newName;
                // 替换成功,返回0
                return 0;
            }
        }
        // 循环结束,执行到这里
        // 意味着数组满了,返回2
        return 2;
    }

    /*
    删除操作:
    分析:
        参数:String[], 人名name

        返回值:boolean
             true: 成功 ---> 把原来名字的位置的元素替换为null
             false:失败
     */

    public static boolean deleteName(String[] names, String name) {
        // 遍历数组
        for (int i = 0; i < names.length; i++) {
            // 逐个比较,找到name
            if (name.equals(names[i])) {
                // 使用null进行替换,表示删除成功
                names[i] = null;
                // 返回 true
                return true;
            }

        }
        // 循环结束
        // 执行到这里,表示删除失败
        // 返回false
        return false;
    }


    /*
    更新操作:
        参数:
            String[], String oldName要被更新的名字,String newName新名字
        返回值:
            boolean
            true : 更新成功
            false: 失败
     */
    public static boolean updateName(String[] names, String oldName, String newName) {
        // 遍历数组
        for (int i = 0; i < names.length; i++) {
            // 跟每个元素进行匹配判断
            if (oldName.equals(names[i])) {
                // 匹配成功,把老的名字替换为新名字
                // 返回true
                names[i] = newName;
                return true;
            }

        }
        // 循环结束
        // 执行到这里,表示更新失败
        // 返回false
        return false;
    }

    /*
    查找操作:
        思路:
            根据要找的名字在数组中匹配

        参数:
            String[] names, String name:要找的名字

         返回值:
            int类型
            返回数组的下标
            成功: index
            失败: 返回-1 数组的下标不会是-1
     */
    public static int findName(String[] names, String name) {
        // 遍历数组
        for (int i = 0; i < names.length; i++) {
            // 依次跟数组元素进行匹配
            if (name.equals(names[i])) {
                // 匹配成功,返回当前的index值
                return i;
            }

        }
        // 循环结束
        // 程序执行到这里,表示没有找到
        // 返回-1
        return -1;
    }

    /*
    更新操作, 结合查找操作
     */
    public static boolean updateName2(String[] names, String oldName, String newName) {
        // 调用查找的方法
        int index = findName(names, oldName);
        // 接收方法的返回值int  index
        if (index == -1) {
            // 判断index 是否找到
            // 如果-1 没有找到
            // 返回false
            return false;
        }
        // 执行到这里,表示找到了
        // 利用index进行名字的替换
        names[index] = newName;
        // 返回true
        return true;
    }

}
